package ar.com.quickMart.database.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import ar.com.quickMart.database.SuperMarketDao;
import ar.com.quickMart.logic.SuperMarket;

public class SuperMarketDaoMySql extends BaseDaoMySql implements SuperMarketDao{
	
	/**
	 * 
	 * addSupermarket
	 * 
	 * Agrega un supermercado a la BDD
	 * 
	 * @param	name	Nombre del supermercado a agregar
	 * @return	true	En caso de exito
	 * 			false	En caso contrario	
	 */
	public boolean addSupermarket(String name, String url) {
		
		// Creo variable para la conexion
		Connection connection;
		
		// Abro la conexion
		connection = connect();
		
		// Creo el query de insercion
		String query = "INSERT INTO Supermercado (Nombre, URLSupermercado) VALUES ( ?, ?)";

		try {		
			// Creo la sentencia y ejecuto el query
			PreparedStatement statement = connection.prepareStatement(query);
			statement.setString(1, name);
			statement.setString(2, url);
			statement.executeUpdate();
		}
		catch (Exception ex) {
			ex.printStackTrace();
			
			// Desconecto de la BDD
			disconnect(connection);
			
			// Error al agregar supermercado, devuelvo false
			return false;
		}
		
		// Desconecto de la BDD
		disconnect(connection);
		
		// Supermercado agregado, devuelvo true
		return true;		
	}
	
	/**
	 * 
	 * getSupermarketId
	 * 
	 * Devuelve el ID de un supermercado cuyo nombre se pasa por parametro
	 * 
	 * @param 	name	Nombre del supermercado
	 * @return			Id del supermercado, -1 en caso contrario
	 */
	public Long getSupermarketId(String name) {
		
		// Creo variable para la conexion
		Connection connection;
		
		// Creo variables para el resultado de la consulta
		ResultSet result;
		long supermarketId;
		
		// Abro la conexion
		connection = connect();
		
		// Creo el query
		String query = "SELECT id From Supermercado WHERE Nombre = \"" + name + "\"";

		try {
			
			// Creo la sentencia y ejecuto el query
			Statement statement = connection.createStatement();
			result = statement.executeQuery(query);
			
			// Obtengo datos de la consulta
			result = statement.getResultSet();
			if(result.next()) {
				supermarketId = (long) result.getLong("id");
			}
			else {
				supermarketId = -1;
			}
		}
		catch (Exception ex) {
			ex.printStackTrace();
			
			// Desconecto de la BDD
			disconnect(connection);
			
			// Error al obtener id, devuelvo -1
			return null;
		}
		
		// Desconecto de la BDD
		disconnect(connection);
		
		// Devuelvo el id
		if(supermarketId > 0){
			return supermarketId;	
		}
		else{
			return null;
		}
	}
	
	public SuperMarket getSupermarket(long superMarketId) {
		
		// Creo variable para la conexion
		Connection connection;
		
		// Creo variables para el resultado de la consulta
		ResultSet result;
		SuperMarket s;
		
		// Abro la conexion
		connection = connect();
		
		// Creo el query
		String query = "SELECT id, Nombre, URLSupermercado FROM supermercado WHERE id = ?;";

		try {
			
			// Creo la sentencia y ejecuto el query
			PreparedStatement statement = connection.prepareStatement(query);
			statement.setLong(1, superMarketId);
			result = statement.executeQuery();
			
			// Obtengo datos de la consulta
			result = statement.getResultSet();
			if(result.next()) {
				s = new SuperMarket();
				
				s.setId(result.getLong("id"));
				s.setName(result.getString("Nombre"));
				s.setUrl(result.getString("URLSupermercado"));
			}
			else {
				s = null;
			}
		}
		catch (Exception ex) {
			ex.printStackTrace();
			
			// Desconecto de la BDD
			disconnect(connection);
			
			// Error al obtener id, devuelvo -1
			return null;
		}
		
		// Desconecto de la BDD
		disconnect(connection);
		

		return s;	
	}
	
	/**
	 * 
	 * removeSupermarket
	 * 
	 * Elimina un supermercado de la BDD
	 * 
	 * @param 	name	Nombre del supermercado a borrar
	 * @return	true	En caso de exito
	 * 			false	En otro caso
	 */
	public boolean removeSupermarket(String name) {
		
		// Creo variable para la conexion
		Connection connection;
		
		// Abro la conexion
		connection = connect();
		
		// Creo el query
		String query = "DELETE FROM Supermercado WHERE Nombre = \"" + name + "\"";

		try {
			
			// Creo la sentencia y ejecuto el query
			Statement statement = connection.createStatement();
			statement.executeUpdate(query);
		}
		catch (Exception ex) {
			ex.printStackTrace();
			
			// Desconecto de la BDD
			disconnect(connection);
			
			// Error al eliminar supermercado, devuelvo false
			return false;
		}
		
		// Desconecto de la BDD
		disconnect(connection);
		
		// Supermercado eliminado, devuelvo true
		return true;		
	}

	@Override
	public List<SuperMarket> getSupermarkets() {
		
		// Creo variable para la conexion
		Connection connection;
		
		// Creo variables para el resultado de la consulta
		ResultSet result;
		List<SuperMarket> supermarkets = new ArrayList<SuperMarket>();
		
		// Abro la conexion
		connection = connect();
		
		// Creo el query
		String query = "SELECT id, Nombre, URLSupermercado FROM supermercado;";

		try {
			
			// Creo la sentencia y ejecuto el query
			PreparedStatement statement = connection.prepareStatement(query);
			result = statement.executeQuery();
			
			// Obtengo datos de la consulta
			result = statement.getResultSet();
			while(result.next()) {
				
				
				SuperMarket s = new SuperMarket();
				
				s.setId(result.getLong("id"));
				s.setName(result.getString("Nombre"));
				s.setUrl(result.getString("URLSupermercado"));
				
				supermarkets.add(s);
			}

		}
		catch (Exception ex) {
			ex.printStackTrace();
			
			// Desconecto de la BDD
			disconnect(connection);
			
			// Error al obtener id, devuelvo -1
			return null;
		}
		
		// Desconecto de la BDD
		disconnect(connection);
		
		// Devuelvo el id
		return supermarkets;
	}

	@Override
	public SuperMarket getSupermarketByBranch(long branchId) {
		// Creo variable para la conexion
		Connection connection;
		
		// Creo variables para el resultado de la consulta
		ResultSet result;
		SuperMarket s;
		
		// Abro la conexion
		connection = connect();
				
		// Creo el query
		String query = "SELECT SUP.id, SUP.Nombre, SUP.URLSupermercado " +
				" FROM Sucursal SUC " +
				" JOIN Supermercado SUP ON SUC.Supermercado_id = SUP.id " +
				" WHERE SUC.id = ?;";

		try {
					
			// Creo la sentencia y ejecuto el query
			PreparedStatement statement = connection.prepareStatement(query);
			statement.setLong(1, branchId);
			result = statement.executeQuery();
					
			// Obtengo datos de la consulta
			result = statement.getResultSet();
			if(result.next()) {
				s = new SuperMarket();
						
				s.setId(result.getLong("id"));
				s.setName(result.getString("Nombre"));
				s.setUrl(result.getString("URLSupermercado"));
			}
			else {
				s = null;
			}
		}
		catch (Exception ex) {
			ex.printStackTrace();
			
			// Desconecto de la BDD
			disconnect(connection);
					
			// Error al obtener id, devuelvo -1
			return null;
		}
				
		// Desconecto de la BDD
		disconnect(connection);
				

		return s;	
	}

}
